// 定义invoke类型
type InvokeFunction = (command: string, args?: Record<string, any>) => Promise<any>;

/**
 * 检查是否在Tauri环境中运行
 * @returns 是否在Tauri环境中
 */
export const isTauriEnvironment = (): boolean => {
  return typeof window !== 'undefined' && '__TAURI__' in (window as any);
};

// 动态获取invoke函数
const getInvoke = async (): Promise<InvokeFunction> => {
  if (!isTauriEnvironment()) {
    throw new Error('This function can only be called in a Tauri environment');
  }
  
  try {
    // 使用window对象访问Tauri API，避免直接导入
    const tauri = (window as any).__TAURI__;
    if (tauri && tauri.invoke) {
      return tauri.invoke.bind(tauri);
    }
    throw new Error('Tauri invoke not found');
  } catch (error) {
    throw new Error('Failed to access Tauri API');
  }
};

/**
 * 文件系统服务，封装与Rust后端的文件操作API通信
 */
export const fileSystemService = {
  /**
   * 选择文件夹
   * @returns 选中的文件夹路径
   */
  selectFolder: async (): Promise<string> => {
      try {
        const tauriInvoke = await getInvoke();
        const path = await tauriInvoke('select_folder');
        return path as string;
      } catch (error) {
        console.error('选择文件夹失败:', error);
        throw new Error(`选择文件夹失败: ${error instanceof Error ? error.message : String(error)}`);
      }
    },

  /**
   * 获取系统默认下载文件夹路径
   * @returns 下载文件夹路径
   */
  getDownloadFolder: async (): Promise<string> => {
      try {
        if (!isTauriEnvironment()) {
          // 在非Tauri环境中返回默认值
          return 'C:\\Users\\用户名\\Downloads';
        }
        const tauriInvoke = await getInvoke();
        const path = await tauriInvoke('get_download_folder');
        return path as string;
      } catch (error) {
        console.error('获取下载文件夹路径失败:', error);
        // 在浏览器环境中或失败时返回默认值
        return 'C:\\Users\\用户名\\Downloads';
      }
    },

  /**
   * 保存文件到指定路径
   * @param fileData 文件数据
   * @param fileName 文件名
   * @param folderPath 文件夹路径
   * @returns 保存的完整文件路径
   */
  saveFileToPath: async (fileData: Uint8Array, fileName: string, folderPath: string): Promise<string> => {
      try {
        const tauriInvoke = await getInvoke();
        const fullPath = await tauriInvoke('save_file_to_path', {
          fileData,
          fileName,
          folderPath
        });
        return fullPath as string;
      } catch (error) {
        console.error('保存文件失败:', error);
        throw new Error(`保存文件失败: ${error instanceof Error ? error.message : String(error)}`);
      }
    },

  isTauriEnvironment
};

/**
 * 工具函数：将Base64数据URL转换为Uint8Array
 * @param dataUrl Base64数据URL
 * @returns Uint8Array数据
 */
export const dataUrlToUint8Array = (dataUrl: string): Uint8Array => {
  // 移除data:image/xxx;base64, 前缀
  const base64Data = dataUrl.split(',')[1];
  
  // 解码Base64
  const binaryString = window.atob(base64Data);
  const length = binaryString.length;
  const bytes = new Uint8Array(length);
  
  for (let i = 0; i < length; i++) {
    bytes[i] = binaryString.charCodeAt(i);
  }
  
  return bytes;
};

export default fileSystemService;